🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / specs / 20260711-153545-message-markdown-styling / quickstart.md
specs/20260711-153545-message-markdown-styling/quickstart.md docs/obtainium-generated-deeplinks (42f311dd) Text, 3.42 KB
Quickstart: Message Inline Markdown Styling
Build/verify/design-check runbook for implementers and reviewers.
Bootstrap (once per shell)
T282828
Tff7b72[ -z Ta5d6ff"Te6edf3$ANDROID_HOMETa5d6ff" Tff7b72] Tff7b72&& Tffa657export Te6edf3ANDROID_HOMETff7b72=Ta5d6ff"Te6edf3$HOMETa5d6ff/Library/Android/sdkTa5d6ff"
Tff7b72[ -f local.properties Tff7b72] Tff7b72|| cp secrets.defaults.properties local.properties
Dependency wiring
1. T383838gradle/libs.versions.toml:
• T383838[versions] add T383838markdown = "0.7.5"
• T383838[libraries] add T383838jetbrains-markdown = { module = "org.jetbrains:markdown", version.ref = "markdown" }
2. T383838core/ui/build.gradle.kts → T383838commonMain.dependencies { implementation(libs.jetbrains.markdown) }
Build order within the single delivery (P1 → P2 → P3)
• P1 render: T383838InlineMarkdown.kt parser + T383838AutoLinkText extension + T383838InlineMarkdownTest. Verify received/injected markdown renders styled.
• P2 toolbar: T383838MessageFormatting.kt helpers + T383838MessageFormattingTest + T383838FormattingToolbar.kt + T383838Message.kt wiring + 4 icons + strings.
• P3 in-field styling: markdown T383838OutputTransformation composed with the mention one in T383838Message.kt.
Strings & icons
• Add toolbar a11y labels + link-dialog strings to T383838core/resources/src/commonMain/composeResources/values/strings.xml (via T383838stringResource(Res.string.*); no hardcoded UI text).
• Run T383838python3 scripts/sort-strings.py after adding strings.
• Add drawables T383838ic_format_bold, T383838ic_format_italic, T383838ic_format_strikethrough, T383838ic_code (Material Symbols line style, matching existing T383838ic_*); T383838ic_link already exists. Add T383838MeshtasticIcons.{Bold,Italic,Strikethrough,Code} extension vals.
Verification
Delegate heavy Gradle to the T383838gradle-runner subagent; git-diff-verify after (it can mutate the tree). Baseline:
T282828
./gradlew spotlessApply spotlessCheck detekt assembleDebug Tffa657test allTests kmpSmokeCompile
Single-module fast loops:
T282828
./gradlew :core:ui:allTests --tests Ta5d6ff"*InlineMarkdown*"
./gradlew :feature:messaging:allTests --tests Ta5d6ff"*MessageFormatting*"
Live verification (mandatory — /verify skill)
Drive the real flow, not just tests:
• Receive/inject a mixed message: T383838Meet at **noon** by the ~~old~~ new *bridge* — \README\T383838 and LINK0 ; confirm all five styles + tappable link, no delimiters, mention + bare-URL still work.
• Search a conversation → confirm markdown is suppressed and highlight still works (FR-009).
• Compose: select text → each toolbar button wraps/toggles; collapsed cursor inserts a pair; Link dialog wraps/unwraps; live in-field styling shows as you type (O-1..O-5).
• Stress the T383838OutputTransformation composition: markdown + mention together, then send, quick-chat append, and type past 200 bytes — watch for offset crashes.
• Desktop: confirm the same rendering (shared T383838commonMain).
Design & docs gates (Constitution V/VI)
• [ ] Toolbar checked against T383838.skills/design-standards; new icons match MeshtasticIcons weight; touch targets ≥ 44dp; TalkBack labels present.
• [ ] Reference iOS PR #1771 as the cross-platform behavior source.
• [ ] Update the messaging T383838docs/ page (T383838last_updated frontmatter) OR apply T383838skip-docs-check with justification.
Screenshot tests
Regenerate Compose preview screenshots for T383838MessageItem/T383838MessageInput via T383838updateDebugScreenshotTest; note T383838allTests may dirty tracked T383838docs/assets/screenshots/*.png on this Mac — T383838git checkout -- unintended changes before committing.
Served by rngit 1.5.0 - Generated in 0.04s